package com.caption.jdk.function;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * 函数式接口, 参考Optional源码
 */
public class PrintDetail<T,R> {
    private final  T value;

    public PrintDetail(){
        this.value = null;
    }
    public PrintDetail(T t){
        this.value = t;
    }

    /**
     * consumer 接口 接收对象，没有返回值
     * @param consumer
     */
    public void print(Consumer<T> consumer){
        consumer.accept(value);

    }

    /**
     * andThen c1处理完成之后，由c2进行处理
     * @param c1
     * @param c2
     */
    public void print2(Consumer<T> c1,Consumer<T> c2){
        c1.andThen(c2).accept(value);
    }


    /**
     * supplier 供给接口, 没有入参，只有返回值
     * @param supplier
     * @return
     */
    public T get(Supplier<T> supplier){
        return value != null ? value : supplier.get();
    }



    /**
     * function 接口，有入参也有返回值
     * @param f1
     * @return
     */
    public R getName(Function<T,R> f1){
       R name = f1.apply(value);
       return name;
    }

    /**
     * andThen  f1完成之后在把得到的结果交个f2运行
     * @param f1
     * @param f2
     * @return
     */
    public Integer getAge(Function<T,Integer> f1,Function<Integer,Integer> f2){
       Integer r= f1.andThen(f2).apply(value);
       return r;
    }

    /**
     * predicate 接口， 传入参数 返回值为true或false
     * @param predicate
     * @return
     */
    public boolean just(Predicate<T> predicate){
      boolean bool =  predicate.test(value);
      return bool;
    }

    /**
     * and 是两个Predicate 同时满足时才会成功
     * @param p1
     * @param p2
     * @return
     */
    public boolean just2(Predicate<T> p1,Predicate<T> p2){
     boolean bool= p1.and(p2).test(value);
     return bool;
    }

}
